-
Notifications
You must be signed in to change notification settings - Fork 578
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
✨ Add the support for capacity blocks #5211
base: main
Are you sure you want to change the base?
✨ Add the support for capacity blocks #5211
Conversation
Hi @athiruma. Thanks for your PR. I'm waiting for a kubernetes-sigs member to verify that this patch is reasonable to test. If it is, they should reply with Once the patch is verified, the new status will be reflected by the I understand the commands that are listed here. Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for your PR @athiruma 👍
Left some suggestions to improve the overall readability.
8ae7c7b
to
d34e59b
Compare
@damdo?? |
/ok-to-test |
/test pull-cluster-api-provider-aws-test |
d34e59b
to
f21fca7
Compare
/test pull-cluster-api-provider-aws-e2e |
/test pull-cluster-api-provider-aws-e2e |
f21fca7
to
05baf2d
Compare
/test pull-cluster-api-provider-aws-e2e |
/test pull-cluster-api-provider-aws-e2e-eks |
1 similar comment
/test pull-cluster-api-provider-aws-e2e-eks |
The eks test is still flakey. I'll take a look at it tomorrow, I think I know where we can improve it |
/test pull-cluster-api-provider-aws-e2e-eks |
/lgtm Thanks, that was an easy review since I could tick off all done comments so quickly! Let's see if E2E tests pass and then we can merge. |
/test pull-cluster-api-provider-aws-e2e |
/test pull-cluster-api-provider-aws-e2e-eks pull-cluster-api-provider-aws-e2e |
2 similar comments
/test pull-cluster-api-provider-aws-e2e-eks pull-cluster-api-provider-aws-e2e |
/test pull-cluster-api-provider-aws-e2e-eks pull-cluster-api-provider-aws-e2e |
/test pull-cluster-api-provider-aws-e2e |
/test pull-cluster-api-provider-aws-e2e-eks pull-cluster-api-provider-aws-e2e |
It could be that the updates are just longer by the nature of the test, so they're hitting timeouts more often. I don't think the failures are related to this change. |
/test pull-cluster-api-provider-aws-e2e-eks pull-cluster-api-provider-aws-e2e |
/test pull-cluster-api-provider-aws-e2e |
/retest |
/test pull-cluster-api-provider-aws-e2e |
1 similar comment
/test pull-cluster-api-provider-aws-e2e |
/retest |
@athiruma: The following tests failed, say
Full PR test history. Your PR dashboard. Please help us cut down on flakes by linking to an open issue when you hit one in your PR. Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
c975830
to
6c1c6bd
Compare
New changes are detected. LGTM label has been removed. |
api/v1beta2/awsmachine_types.go
Outdated
// UseCapacityBlock enables usage of pre-purchased compute capacity (capacity blocks) with AWS Capacity Reservations. | ||
// If enabled, CapacityReservationID must be specified to identify the target reservation. | ||
// +optional | ||
UseCapacityBlock *bool `json:"useCapacityBlock,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this needed, if all it is doing is enabling the capacity reservation ID field?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we need this to use for AWS capacity blocks for ml.
return &ec2.InstanceMarketOptionsRequest{ | ||
MarketType: aws.String(ec2.MarketTypeCapacityBlock), | ||
}, nil |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not make the exposed API mirror this in a way that we can expand the values in the future, without having to have lots of UseXYZ
kinds of fields?
Would be much better to expose an enum, bools don't age well
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we have 3 marketType options here: spot, on-demand and capacity-block where we can omit on-demand.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@JoelSpeed How about now?
Adding the MarketType API field. It can be set to two values spot/ capacity-block. If not specified and SpotMarketOptions
is specified default we will set MarketType to capacity-block
@damdo ptal ? |
b5997f8
to
7a2948f
Compare
api/v1beta2/awsmachine_types.go
Outdated
@@ -197,6 +197,14 @@ type AWSMachineSpec struct { | |||
// CapacityReservationID specifies the target Capacity Reservation into which the instance should be launched. | |||
// +optional | |||
CapacityReservationID *string `json:"capacityReservationId,omitempty"` | |||
|
|||
// MarketType specifies the type of market for the EC2 instance. Valid values include: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// MarketType specifies the type of market for the EC2 instance. Valid values include: | |
// marketType specifies the type of market for the EC2 instance. Valid values include: |
api/v1beta2/awsmachine_types.go
Outdated
// If this value is selected, CapacityReservationID must be specified to identify the target reservation. | ||
// If MarketType is not specified and SpotMarketOptions is provided, the MarketType defaults to "spot". | ||
// +optional | ||
MarketType *MarketType `json:"marketType,omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this need to be a pointer?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It should allow empty values so I thought we should use a pointer here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you care about the difference between marketType: ""
and the field not being present at all? The controller will treat those two representations in the same way won't it?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, I see then I'll make a change. Thanks
api/v1beta2/types.go
Outdated
const ( | ||
// MarketTypeOnDemand is a MarketType enum value | ||
MarketTypeOnDemand MarketType = "on-demand" | ||
|
||
// MarketTypeSpot is a MarketType enum value | ||
MarketTypeSpot MarketType = "spot" | ||
|
||
// MarketTypeCapacityBlock is a MarketType enum value | ||
MarketTypeCapacityBlock MarketType = "capacity-block" | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Kubernetes API conventions state that enum values should be PascalCase. We prefer this and then to convert to upstream APIs (EC2) in this case so that there's consistency across Kube like APIs. So these should really be OnDemand, Spot and CapacityBlock
} | ||
|
||
// MarketType describes the market type of an Instance | ||
type MarketType string |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You'll need a kubebuilder:validation:Enum
marker on here to make sure the correct schema is generated
api/v1beta2/awsmachine_webhook.go
Outdated
@@ -361,6 +362,14 @@ func (r *AWSMachine) validateNetworkElasticIPPool() field.ErrorList { | |||
return allErrs | |||
} | |||
|
|||
func (r *AWSMachine) validateInstanceMarketType() field.ErrorList { | |||
var allErrs field.ErrorList | |||
if ptr.Deref(r.Spec.MarketType, "") == MarketTypeCapacityBlock && r.Spec.SpotMarketOptions != nil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
shouldn't this also check MarketType is not ondemand if SpotMarketOptions != nil? i.e. the check should be that the only valid when SpotMarketOptions != nil is MarketType==spot
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
oh yeah good catch thanks
api/v1beta2/awsmachine_types.go
Outdated
@@ -197,6 +197,14 @@ type AWSMachineSpec struct { | |||
// CapacityReservationID specifies the target Capacity Reservation into which the instance should be launched. | |||
// +optional | |||
CapacityReservationID *string `json:"capacityReservationId,omitempty"` | |||
|
|||
// MarketType specifies the type of market for the EC2 instance. Valid values include: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we describe in gdoc what's the default behaviour if I don't set spot or capacityBlock? i.e on demand
7a2948f
to
c1d94dc
Compare
What type of PR is this?
/kind feature
What this PR does / why we need it:
This PR added the support for CapacityBlocks for ML, by adding this we can get the support for capacity reservations of capacity blocks for ML provided by AWS.
Which issue(s) this PR fixes (optional, in
fixes #<issue number>(, fixes #<issue_number>, ...)
format, will close the issue(s) when PR gets merged):Fixes # #5045
Special notes for your reviewer:
Checklist:
Release note: